/*
 * @Author: QinJiu
 * @Date: 2022-07-20 10:29:24
 * @LastEditors: Qinjiu
 * @LastEditTime: 2022-07-20 15:29:01
 * @Description:
 */

import * as userApi from "@/api/user";
import to from "@/utils/await-to";
import * as auth from "@/utils/auth";
import { resetRouter } from "@/router";
import _ from "lodash";

// 获取默认状态数据
const getDefaultState = () => {
  return {
    token: auth.getToken(),
    userInfo: {},
  };
};

// 初始状态数据
const state = getDefaultState();

const mutations = {
  // 清除状态数据
  RESET_STATE: (state) => {
    auth.removeToken();
    Object.assign(state, getDefaultState());
  },
  // 设置Token
  SET_TOKEN(state, token = "") {
    auth.setToken(token);
    state.token = token;
  },
  // 设置用户信息
  SET_USER_INFO(state, userInfo = {}) {
    state.userInfo = userInfo;
  },
};

const actions = {
  /**
   * 登录
   */
  async login({ commit, dispatch }, params = {}) {
    const [error, result] = await to(userApi.login(params));
    // 接口异常
    if (error) {
      return Promise.reject(error);
    }
    // 接口正常
    else {
      const token = _.get(result, "data.token") || "";
      const userInfo = _.get(result, "data.userInfo") || {};

      // 保存token
      commit("SET_TOKEN", token);
      // 保存用户信息
      commit("SET_USER_INFO", userInfo);

      return Promise.resolve(result);
    }
  },

  // 获取用户信息
  async getUserInfo({ commit }, token) {
    const [error, result] = await to(userApi.getUserInfo({ token }));
    // 接口异常
    if (error) {
      return Promise.reject(error);
    }
    // 接口正常
    else {
      const userInfo = result?.data?.userInfo ?? {};
      // 保存用户信息
      commit("SET_USER_INFO", userInfo);

      return Promise.resolve(result);
    }
  },

  // 退出登录
  async logout({ commit, state, dispatch }) {
    // const [error, result] = await to(userApi.logout());
    // // 接口异常
    // if (error) {
    //   return Promise.reject(error);
    // }
    // // 接口正常
    // else {
    //   // 重置状态数据
    //   commit("RESET_STATE");
    //   // 重置路由
    //   resetRouter();
    //   return Promise.resolve(result);
    // }
    return await dispatch("resetToken");
  },

  // 清除token
  async resetToken({ commit }) {
    // 重置状态数据
    commit("RESET_STATE");
    // 重置路由
    resetRouter();
    return true;
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
